package com.atguigu.srb.sms.feign;

import com.atguigu.srb.base.exception.SrbBussinessException;
import com.atguigu.srb.base.result.R;
import com.atguigu.srb.sms.feign.fallback.RpcFallback;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.web.bind.annotation.*;

/*
   FeignClient的value值用来指定当前客户端要远程访问的微服务(host:port)
    value = "service-core"  根据服务名到注册中心获取它的ip地址+端口号 列表
                192.168.1.1:8110
 */
@FeignClient(value = "service-core",fallback = RpcFallback.class)
public interface RpcClient {
    //192.168.1.1:8110/admin/rpc/test1
    @GetMapping("/admin/rpc/test1") //指定请求方式 和资源路径
    public R test1();
    //上面的接口方式远程访问 原理仍然是httpClient(通过url地址+请求方式...)
    @PostMapping("/admin/rpc/test2/{id}")
    public R test2(@PathVariable("id")String id);
    @PostMapping("/admin/rpc/test3")  //默认feign客户端 抽象方法的参数是请求体参数
    //实际参数希望以请求参数的方式提交，可以通过注解标注
    public R test3(@RequestParam("username") String username  ,
                   @RequestParam("password") String password);
    @PostMapping("/admin/rpc/test4")
    public R test4(@RequestBody SrbBussinessException e);

    // feign客户端远程调用默认超时时间为1秒

    //如果以请求体方式提交请求，请求方式为get，feign客户端会自动转为post提交
    @GetMapping("/admin/rpc/test5")  //core服务pojo入参：参数以请求参数方式提交
    public R test5(@SpringQueryMap SrbBussinessException e); //可以将简单的对象转为请求参数提交
    // feign底层是发送Http协议的网络请求 ，可以配置查看feign远程调用的日志(请求报文和响应报文)
}
